#include <stdio.h>

#define Size 3

#define ArraySize(a) sizeof(a)/sizeof(a[0])

//数组名在作为函数参数传递时，表现为指针：地址是数组首元素的地址
void PrintArray(int a[Size])
{
    for(int i = 0;i <Size;i++)
    {
        printf("%d\n",a[i]);
    }
}
/*
    数组：一组数据类型相同的元素集合

    16进制：1 2 3 4 5 6 7 8 9 a b c d e f 10 11
    8c      90      94 
    a[0]    a[1]    a[2]

    git
*/
int main()
{
    // int a[Size] = {1,2,3};
    // //指针的数据类型代表它的步长
    // for(int i = 0;i <Size;i++)
    // {
    //     printf("%d  ",*(a + i)); //通过指针访问数组元素
    //     //a[i] == *(a + i);
    // }
    // // int *p = a;
    // printf("%d\n",*p);
    //PrintArray(a);

    // int a[3];
    // printf("%ld\n",sizeof(a));
    // //数组单个元素
    // //数组下标：代表数组中的元素序号，从0开始
    // a[0] = 1;
    // a[1] = 2;
    // a[2] = 3;
    // //访问越界：数组访问的下标超过了最大限度
    // //a[3]

    // //数组通过下标循环访问
    // for(int i = 0;i < 3;i++)
    // {
    //     printf("%d\n",a[i]);
    // }
    // printf("\n");

    //数组初始化
    //int a[3] = {1,2,3};
    //int a[] = {1,2,3};

    //静态数组：容量不能变化的数组
    //数组的地址是连续的
    // int a[Size] = {1,2,3};
    // for(int i = 0;i < 3;i++)
    // {
    //     printf("%d  %p\n",a[i]);
    // }
    // printf("\n");

    //数组的容量：数组的总大小/单个数组的大小
    // int a[] = {1,2,3,5,6,2,4,0};
    // for(int i = 0;i < ArraySize(a);i++)
    // {
    //     printf("%d   %p\n",a[i]);
    // }

    int a[Size] = {1,2,3};
    int b [] = {1,2,3};
    PrintArray(b);
    printf("%p  %p  %p\n",a,&a,&a[0]);
    printf("%p  %p  %p\n",a + 1,&a + 1,&a[0] + 1);
    //&a[0] == a   数组首元素的地址
    //&a: 数组的首地址
    int *p = a;
    printf("%p  %p\n",p,&p);
    int h = 20;
    int *k = &h;
    printf("%p  %p  %p\n",k,&k,&h);

    printf("%p %p\n",b,&b);
    return 0;
}



